package com.kexio.dynamic.config.service;

import com.kexio.dynamic.config.entity.ConfigEntity;

import java.util.List;
import java.util.Map;

/**
 * 配置管理服务接口
 * 
 * 提供配置的CRUD操作和管理功能
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface ConfigService {

    /**
     * 获取配置值
     * 
     * @param key 配置键
     * @return 配置值
     */
    String getValue(String key);

    /**
     * 获取配置值（带默认值）
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    String getValue(String key, String defaultValue);

    /**
     * 获取配置值（指定环境）
     * 
     * @param key         配置键
     * @param environment 环境标识
     * @return 配置值
     */
    String getValueByEnvironment(String key, String environment);

    /**
     * 获取整数类型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Integer getIntValue(String key, Integer defaultValue);

    /**
     * 获取长整型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Long getLongValue(String key, Long defaultValue);

    /**
     * 获取布尔类型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Boolean getBooleanValue(String key, Boolean defaultValue);

    /**
     * 获取双精度类型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Double getDoubleValue(String key, Double defaultValue);

    /**
     * 获取JSON类型配置值
     * 
     * @param key   配置键
     * @param clazz 目标类型
     * @return 配置对象
     */
    <T> T getJsonValue(String key, Class<T> clazz);

    /**
     * 获取配置分组的所有配置
     * 
     * @param group 配置分组
     * @return 配置映射 (key -> value)
     */
    Map<String, String> getGroupConfigs(String group);

    /**
     * 获取所有配置
     * 
     * @return 配置实体列表
     */
    List<ConfigEntity> getAllConfigs();

    /**
     * 获取配置实体
     * 
     * @param key 配置键
     * @return 配置实体
     */
    ConfigEntity getConfig(String key);

    /**
     * 保存或更新配置
     * 
     * @param config 配置实体
     * @return 是否成功
     */
    boolean saveOrUpdate(ConfigEntity config);

    /**
     * 批量保存配置
     * 
     * @param configs 配置实体列表
     * @return 成功数量
     */
    int batchSave(List<ConfigEntity> configs);

    /**
     * 更新配置值
     * 
     * @param key   配置键
     * @param value 配置值
     * @return 是否成功
     */
    boolean updateValue(String key, String value);

    /**
     * 删除配置
     * 
     * @param key 配置键
     * @return 是否成功
     */
    boolean deleteConfig(String key);

    /**
     * 启用/禁用配置
     * 
     * @param key     配置键
     * @param enabled 是否启用
     * @return 是否成功
     */
    boolean toggleConfig(String key, boolean enabled);

    /**
     * 根据标签查询配置
     * 
     * @param tags 标签
     * @return 配置实体列表
     */
    List<ConfigEntity> getConfigsByTags(String tags);

    /**
     * 刷新缓存
     */
    void refreshCache();

    /**
     * 清空缓存
     */
    void clearCache();
}
